<?php
class mydb {
    /* 数据库编码 */
    public $charset = 'utf8';

    /* 数据库连接 */
    private $link = null;

    /* 查询次数 */
    private $query_times = 0;

    /* 是否处于调试状态 */
    private $debug = false;

    // 构造
    function __construct() {
        //global $connection;
        //$this->link = $connection;
        $con = mysql_connect('localhost','root','rolarola');

        if($con){
            $this->link = $con;
            mysql_select_db('shop', $this->link);
            //echo 'connected ';
        }else{
            echo "database is gone.";
            exit;
        }
    }

    // 析构
    function __destruct() {
        $this->close ();
    }

    /**
     * 关闭数据库连接
     *
     * @return bool 是否关闭成功
     */
    function close() {
        return mysql_close ( $this->link );
    }

    /**
     * 向数据库服务器发送一条查询语句
     *
     * @param string $sql      SQL语句
     * @param bool $if_buffer  当为true时，处理很大的结果集时会节省可观的内存，
     *                         而且在获取第一行后立即对结果集进行操作，而不用等到整个SQL语句都执行完毕
     *                         但在返回的结果集之上不能获取返回的行数（mysql_num_rows）
     * @return resource or bool
     */
    function query($sql, $if_buffer = false) {
        mysql_query("SET NAMES '{$this->charset}' ");
        if ($if_buffer) {
            $rs = mysql_unbuffered_query ( $sql, $this->link );
        } else {
            $rs = mysql_query ( $sql, $this->link );
        }

        $this->query_times ++;

        if (! $rs) {
            $this->halt ( "Can't query: $sql " );
        }

        return $rs;
    }

    /**
     * 获取一条数据记录
     *
     * @param string $sql 查询的SQL语句
     * @param int $result_type  三种取值：MYSQL_ASSOC，MYSQL_NUM 和 MYSQL_BOTH
     * @return array  以数组形式返回一条数据
     */
    function getOne($sql, $result_type = MYSQL_ASSOC) {
        $rt = $this->query ( $sql);
        return mysql_fetch_array ( $rt, $result_type );
    }

    /**
     * @param strin $sql
     * @return array
     */
    function getAll($sql){
        $result = $this->query( $sql );
        $data = array ();
        while($row = $this->fetchArray( $result )) {
            $data[] = $row;
        }

        return $data;
    }

    /**
     * 从结果集取得的行生成的数组
     *
     * @param resource $query
     * @param int $result_type  三种取值：MYSQL_ASSOC，MYSQL_NUM 和 MYSQL_BOTH
     * @return array or bool
     */
    function fetchArray($query, $result_type = MYSQL_ASSOC) {
        return mysql_fetch_array ( $query, $result_type );
    }

    /**
     * 执行一条SQL语句
     *
     * @param string $sql SQL语句
     * @param  bool  $db_optimize 是否优化查询
     * @return bool  执行语句是否成功
     */
    function exe($sql, $db_optimize = true) {
        if ($GLOBALS ['optimize'] && $db_optimize) {
            $sql = trim ( $sql );
            $sql = substr ( $sql, 0, 6 ) . ' LOW_PRIORITY ' . substr ( $sql, 6 );
        }
        mysql_query("SET NAMES '{$this->charset}' ");
        $query = mysql_unbuffered_query ( $sql, $this->link );
        $this->query_times ++;
        if (! $query)
        $this->halt ( "Can't operate: $sql " );
        return $query;
    }

    /**
     * 如果符合某条件的记录存在，则对其进行更新，反之进行插入
     *
     * @param string $sql_select 查询某条记录是否存在的SQL语句
     * @param string $sql_update 如果存在后的更新SQL语句
     * @param string $sql_insert 如果不存在后的插入SQL语句
     * @return bool 操作是否成功
     */
    function checkAndExe($sql_select, $sql_update, $sql_insert) {
        $rs = $this->getOne ( $sql_select, true );
        if ($rs) {
            $rt = $this->exe ( $sql_update );
        } else {
            $rt = $this->exe ( $sql_insert );
        }
        return $rt;
    }

    /**
     * INSERT操作后的AUTO_INCREMENT的ID号
     *
     * @return int
     */
    function getId() {
        return mysql_insert_id ( $this->link );
    }

    /**
     * 返回SELECT结果集中行的数目
     * 或取得最近一次与 $this->link 关联的INSERT，UPDATE或DELETE查询所影响的记录行数。
     *
     * @param resource $query
     * @param bool $is_select 是否为SELECT语句的产生的
     * @return int
     */
    function rowsNum($query = NULL, $is_select = false) {
        if ($is_select) {
            $num = $query ? mysql_num_rows ( $query ) : 0;
        } else {
            $num = mysql_affected_rows ( $this->link );
        }
        return $num;
    }

    /**
     * 查询的次数
     *
     * @return int
     */
    function queryTimes() {
        return $this->query_times;
    }

    /**
     *  获取一张数据表的字段
     *
     * @param $string $table_name 数据表的名称
     *
     * @return array 数组的键值为字段名，值为默认值
     */
    function tableField($table_name) {
        $rt = array ();
        $query = $this->query ( "DESC $table_name" );
        while ( $row = $this->fetchArray ( $query ) ) {
            $rt [$row ['Field']] = $row ['Default'];
        }
        return $rt;
    }

    /**
     * 释放所有与结果标识符 result 所关联的内存
     * 在考虑到返回很大的结果集时会占用多少内存时调用
     *
     * @param resource $query
     * @return bool
     */
    function freeResult($query) {
        return mysql_free_result ( $query );
    }

    /**
     * 当操作失败或出现意外的时，给出的信息
     *
     * @param string $msg
     */
    function halt($msg = '') {
        $err = $this->debug ? mysql_error ( $this->link ) . '<br />Other:' . $msg : 'Sorry,the database failure!';
        exit ( $err );
    }


}
?>